package com.example.study2.ClassDefinitionAndUsage.Methods;

/**
 * 构造方法示例
 * 构造方法用于初始化对象。
 * 方法名必须与类名相同。
 * 没有返回类型（连 void 也没有）。
 * 在创建对象时，构造方法会自动调用，每创建一个对象就调用一次构造函数。
 * 一个类可以有多个构造方法（通过不同的参数列表实现重载）。
 * 如果类中没有显式定义构造方法，Java 会提供一个默认的无参构造方法。
 */
public class Student2 {
    // 实例字段
    private String name;
    private int age;
    private String major;

    /**
     * 构造方法1：无参构造方法
     * 如果没有显式定义构造方法，Java会提供默认的无参构造方法
     * 但如果定义了其他构造方法，默认的无参构造方法就不会自动提供
     */
    public Student2() {
        this.name = "Unknown";  // 设置默认姓名
        this.age = 18;          // 设置默认年龄
        this.major = "Undeclared"; // 设置默认专业
    }

    /**
     * 构造方法2：带参构造方法
     * @param name 学生姓名
     * @param age 学生年龄
     */
    public Student2(String name, int age) {
        this.name = name;  // 初始化姓名
        this.age = age;    // 初始化年龄
        this.major = "Undeclared"; // 设置默认专业
    }

    /**
     * 构造方法3：带参构造方法（重载）
     * @param name 学生姓名
     * @param age 学生年龄
     * @param major 学生专业
     */
    public Student2(String name, int age, String major) {
        this.name = name;   // 初始化姓名
        this.age = age;     // 初始化年龄
        this.major = major; // 初始化专业
    }

    /**
     * 显示学生信息
     */
    public void displayInfo() {
        System.out.println("Name: " + this.name);
        System.out.println("Age: " + this.age);
        System.out.println("Major: " + this.major);
        System.out.println("---------------");
    }

    public static void main(String[] args) {
        // 使用无参构造方法创建对象
        Student2 student1 = new Student2();
        student1.displayInfo(); // 输出默认信息

        // 使用带两个参数的构造方法创建对象
        Student2 student2 = new Student2("Alice", 20);
        student2.displayInfo(); // 输出：Name: Alice, Age: 20, Major: Undeclared

        // 使用带三个参数的构造方法创建对象
        Student2 student3 = new Student2("Bob", 22, "Computer Science");
        student3.displayInfo(); // 输出：Name: Bob, Age: 22, Major: Computer Science
    }
}